package stat
import (
"fmt"
"github.com/K-Phoen/grabana/errors"
"github.com/K-Phoen/grabana/links"
"github.com/K-Phoen/grabana/scheme"
"github.com/K-Phoen/grabana/target/graphite"
"github.com/K-Phoen/grabana/target/influxdb"
"github.com/K-Phoen/grabana/target/prometheus"
"github.com/K-Phoen/grabana/target/stackdriver"
"github.com/K-Phoen/sdk"
)
type Option func (stat *Stat ) error
type ThresholdStep struct {
Color string
Value *float64
}
type TextMode string
const (
TextAuto TextMode = "auto"
TextValue TextMode = "value"
TextName TextMode = "name"
TextValueAndName TextMode = "value_and_name"
TextNone TextMode = "none"
)
type OrientationMode string
const (
OrientationAuto OrientationMode = ""
OrientationHorizontal OrientationMode = "horizontal"
OrientationVertical OrientationMode = "vertical"
)
type ReductionType int
const (
Min ReductionType = iota
Max
Avg
First
FirstNonNull
Last
LastNonNull
Total
Count
Range
)
type ValueMap struct {
Value string
Text string
}
type RangeMap struct {
From string
To string
Text string
}
type Stat struct {
Builder *sdk .Panel
}
func New (title string , options ...Option ) (*Stat , error ) {
panel := &Stat {Builder : sdk .NewStat (title )}
panel .Builder .IsNew = false
for _ , opt := range append (defaults (), options ...) {
if err := opt (panel ); err != nil {
return nil , err
}
}
return panel , nil
}
func defaults() []Option {
return []Option {
Text (TextValue ),
ColorValue (),
Orientation (OrientationVertical ),
Span (6 ),
ValueType (Last ),
NoValue ("N/A" ),
ColorScheme (scheme .ThresholdsValue (scheme .Last )),
}
}
func Links (panelLinks ...links .Link ) Option {
return func (stat *Stat ) error {
stat .Builder .Links = make ([]sdk .Link , 0 , len (panelLinks ))
for _ , link := range panelLinks {
stat .Builder .Links = append (stat .Builder .Links , link .Builder )
}
return nil
}
}
func DataSource (source string ) Option {
return func (stat *Stat ) error {
stat .Builder .Datasource = &sdk .DatasourceRef {LegacyName : source }
return nil
}
}
func WithPrometheusTarget (query string , options ...prometheus .Option ) Option {
target := prometheus .New (query , options ...)
return func (stat *Stat ) error {
stat .Builder .AddTarget (&sdk .Target {
RefID : target .Ref ,
Hide : target .Hidden ,
Expr : target .Expr ,
IntervalFactor : target .IntervalFactor ,
Interval : target .Interval ,
Step : target .Step ,
LegendFormat : target .LegendFormat ,
Instant : target .Instant ,
Format : target .Format ,
})
return nil
}
}
func WithGraphiteTarget (query string , options ...graphite .Option ) Option {
target := graphite .New (query , options ...)
return func (stat *Stat ) error {
stat .Builder .AddTarget (target .Builder )
return nil
}
}
func WithInfluxDBTarget (query string , options ...influxdb .Option ) Option {
target := influxdb .New (query , options ...)
return func (stat *Stat ) error {
stat .Builder .AddTarget (target .Builder )
return nil
}
}
func WithStackdriverTarget (target *stackdriver .Stackdriver ) Option {
return func (stat *Stat ) error {
stat .Builder .AddTarget (target .Builder )
return nil
}
}
func Span (span float32 ) Option {
return func (stat *Stat ) error {
if span < 1 || span > 12 {
return fmt .Errorf ("span must be between 1 and 12: %w" , errors .ErrInvalidArgument )
}
stat .Builder .Span = span
return nil
}
}
func Height (height string ) Option {
return func (stat *Stat ) error {
stat .Builder .Height = &height
return nil
}
}
func Description (content string ) Option {
return func (stat *Stat ) error {
stat .Builder .Description = &content
return nil
}
}
func Transparent () Option {
return func (stat *Stat ) error {
stat .Builder .Transparent = true
return nil
}
}
func Unit (unit string ) Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .FieldConfig .Defaults .Unit = unit
return nil
}
}
func Decimals (count int ) Option {
return func (stat *Stat ) error {
if count < 0 {
return fmt .Errorf ("decimals must be greater than 0: %w" , errors .ErrInvalidArgument )
}
stat .Builder .StatPanel .FieldConfig .Defaults .Decimals = &count
return nil
}
}
func SparkLine () Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .Options .GraphMode = "area"
return nil
}
}
func SparkLineYMin (value float64 ) Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .FieldConfig .Defaults .Min = &value
return nil
}
}
func SparkLineYMax (value float64 ) Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .FieldConfig .Defaults .Max = &value
return nil
}
}
func ValueType (valueType ReductionType ) Option {
return func (stat *Stat ) error {
var valType string
switch valueType {
case First :
valType = "first"
case FirstNonNull :
valType = "firstNotNull"
case Last :
valType = "last"
case LastNonNull :
valType = "lastNotNull"
case Min :
valType = "min"
case Max :
valType = "max"
case Avg :
valType = "mean"
case Count :
valType = "count"
case Total :
valType = "sum"
case Range :
valType = "range"
default :
return fmt .Errorf ("unknown value type: %w" , errors .ErrInvalidArgument )
}
stat .Builder .StatPanel .Options .ReduceOptions .Calcs = []string {valType }
return nil
}
}
func ValueFontSize (size int ) Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .Options .Text .ValueSize = size
return nil
}
}
func TitleFontSize (size int ) Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .Options .Text .TitleSize = size
return nil
}
}
func ColorNone () Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .Options .ColorMode = "none"
return nil
}
}
func ColorValue () Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .Options .ColorMode = "value"
return nil
}
}
func ColorBackground () Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .Options .ColorMode = "background"
return nil
}
}
func AbsoluteThresholds (steps []ThresholdStep ) Option {
return func (stat *Stat ) error {
sdkSteps := make ([]sdk .ThresholdStep , 0 , len (steps ))
for _ , step := range steps {
sdkSteps = append (sdkSteps , sdk .ThresholdStep {
Color : step .Color ,
Value : step .Value ,
})
}
stat .Builder .StatPanel .FieldConfig .Defaults .Thresholds = sdk .Thresholds {
Mode : "absolute" ,
Steps : sdkSteps ,
}
return nil
}
}
func RelativeThresholds (steps []ThresholdStep ) Option {
return func (stat *Stat ) error {
sdkSteps := make ([]sdk .ThresholdStep , 0 , len (steps ))
for _ , step := range steps {
sdkSteps = append (sdkSteps , sdk .ThresholdStep {
Color : step .Color ,
Value : step .Value ,
})
}
stat .Builder .StatPanel .FieldConfig .Defaults .Thresholds = sdk .Thresholds {
Mode : "percentage" ,
Steps : sdkSteps ,
}
return nil
}
}
func Repeat (repeat string ) Option {
return func (stat *Stat ) error {
stat .Builder .Repeat = &repeat
return nil
}
}
func RepeatDirection (direction sdk .RepeatDirection ) Option {
return func (stat *Stat ) error {
stat .Builder .RepeatDirection = &direction
return nil
}
}
func Text (mode TextMode ) Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .Options .TextMode = string (mode )
return nil
}
}
func Orientation (mode OrientationMode ) Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .Options .Orientation = string (mode )
return nil
}
}
func ColorScheme (options ...scheme .Option ) Option {
return func (stat *Stat ) error {
scheme .New (&stat .Builder .StatPanel .FieldConfig , options ...)
return nil
}
}
func NoValue (text string ) Option {
return func (stat *Stat ) error {
stat .Builder .StatPanel .FieldConfig .Defaults .NoValue = text
return nil
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .